package com.example.oom;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.PooledByteBufAllocator;

import java.util.ArrayList;
import java.util.List;

public class DirectMemoryOOMWithNetty {

    public static void main(String[] args) {
        System.out.println("开始使用 Netty 模拟 Direct buffer memory OOM...");

        // Netty 默认使用 PooledByteBufAllocator（池化分配器）
        // 我们显式创建一个实例，控制行为
        PooledByteBufAllocator allocator = new PooledByteBufAllocator(true);

        List<ByteBuf> buffers = new ArrayList<>();
        int count = 0;

        try {
            while (true) {
                // 每次申请 10MB 直接内存
                ByteBuf byteBuf = allocator.directBuffer(10 * 1024 * 1024);

                // 写入一点数据，避免懒加载
                byteBuf.writeByte(1);

                // 保存引用，防止被回收
                buffers.add(byteBuf);

                count++;
                if (count % 10 == 0) {
                    System.out.println("已分配 " + (count * 10) + " MB 直接内存...");
                }
            }
        } catch (Throwable e) {
            System.err.println("触发 Direct buffer memory OOM！");
            e.printStackTrace();
            System.out.println("总共分配次数: " + count);
        }
    }
}
